#!/usr/bin/env python3
# -*- coding: utf-8
"""
编码工具模块 - 永久解决Windows控制台乱码问题
"""

import sys
import os
import locale
import subprocess
from typing import Optional

def setup_console_encoding() -> bool:
    """
    设置控制台编码为UTF-8
    
    Returns:
        bool: 设置是否成功
    """
    try:
        # 1. 设置环境变量
        os.environ['PYTHONIOENCODING'] = 'utf-8'
        os.environ['PYTHONUTF8'] = '1'
        
        # 2. 设置标准输出编码
        if hasattr(sys.stdout, 'reconfigure'):
            sys.stdout.reconfigure(encoding='utf-8', errors='replace')
        if hasattr(sys.stderr, 'reconfigure'):
            sys.stderr.reconfigure(encoding='utf-8', errors='replace')
        
        # 3. Windows系统特殊处理
        if sys.platform == 'win32':
            try:
                # 设置控制台代码页为UTF-8 (65001)
                subprocess.run(['chcp', '65001'], shell=True, capture_output=True, check=False)
                
                # 设置控制台字体支持UTF-8
                import ctypes
                from ctypes import wintypes
                
                # 获取控制台句柄
                kernel32 = ctypes.windll.kernel32
                handle = kernel32.GetStdHandle(-11)  # STD_OUTPUT_HANDLE
                
                # 设置控制台输出模式支持UTF-8
                if handle != -1:
                    mode = wintypes.DWORD()
                    if kernel32.GetConsoleMode(handle, ctypes.byref(mode)):
                        # 启用UTF-8输出
                        mode.value |= 0x0004  # ENABLE_VIRTUAL_TERMINAL_PROCESSING
                        kernel32.SetConsoleMode(handle, mode)
                        
            except Exception as e:
                # 如果设置失败，继续执行
                pass
        
        return True
        
    except Exception as e:
        print(f"编码设置失败: {e}")
        return False

def safe_print(*args, **kwargs) -> None:
    """
    安全的打印函数，处理编码问题
    
    Args:
        *args: 要打印的参数
        **kwargs: 其他打印参数
    """
    try:
        # 确保编码设置
        setup_console_encoding()
        
        # 处理特殊字符
        processed_args = []
        for arg in args:
            if isinstance(arg, str):
                # 替换可能导致编码问题的字符
                arg = arg.replace('✅', '[成功]')
                arg = arg.replace('❌', '[失败]')
                arg = arg.replace('🔍', '[搜索]')
                arg = arg.replace('📊', '[统计]')
                arg = arg.replace('🎯', '[目标]')
                arg = arg.replace('📁', '[文件]')
                arg = arg.replace('📄', '[页码]')
                arg = arg.replace('🔢', '[索引]')
                arg = arg.replace('📝', '[内容]')
                processed_args.append(arg)
            else:
                processed_args.append(arg)
        
        print(*processed_args, **kwargs)
        
    except Exception as e:
        # 如果还是有问题，使用ASCII安全模式
        try:
            ascii_args = []
            for arg in processed_args:
                if isinstance(arg, str):
                    # 转换为ASCII安全字符串
                    ascii_arg = arg.encode('ascii', 'replace').decode('ascii')
                    ascii_args.append(ascii_arg)
                else:
                    ascii_args.append(arg)
            print(*ascii_args, **kwargs)
        except:
            print("打印失败")

def get_safe_emoji(emoji: str) -> str:
    """
    获取安全的emoji替代文本
    
    Args:
        emoji: 原始emoji
        
    Returns:
        str: 安全的替代文本
    """
    emoji_map = {
        '✅': '[成功]',
        '❌': '[失败]',
        '🔍': '[搜索]',
        '📊': '[统计]',
        '🎯': '[目标]',
        '📁': '[文件]',
        '📄': '[页码]',
        '🔢': '[索引]',
        '📝': '[内容]',
        '🚀': '[启动]',
        '⚡': '[快速]',
        '💡': '[提示]',
        '🔧': '[工具]',
        '📋': '[列表]',
        '🎉': '[完成]',
        '⚠️': '[警告]',
        '🔄': '[处理]',
        '💾': '[保存]',
        '📤': '[上传]',
        '📥': '[下载]'
    }
    
    return emoji_map.get(emoji, emoji)

def test_encoding_support() -> bool:
    """
    测试编码支持
    
    Returns:
        bool: 是否支持UTF-8编码
    """
    try:
        test_strings = [
            "测试中文",
            "Test English", 
            "✅ 成功",
            "❌ 失败",
            "🔍 搜索",
            "📊 统计"
        ]
        
        for text in test_strings:
            print(text)
        
        return True
        
    except UnicodeEncodeError:
        return False
    except Exception:
        return False

# 自动设置编码
setup_console_encoding()

# 导出常用函数
__all__ = [
    'setup_console_encoding',
    'safe_print', 
    'get_safe_emoji',
    'test_encoding_support'
]
